#ifndef GY_CALCULATIONCLASS_H
#define GY_CALCULATIONCLASS_H

#include <QObject>
#include <QPointF>
#include <QMap>
#include <QVariant>
#include "../../LuaInterpreter/lua.hpp"
#include "../ReplicationGraphics/GY_ObjectGroup.h"

//struct BindingInformation
//{
//    int type;//类型，1子类属性，0组件属性
//    QVector<QVariant> value;//计算结果
//    QVector<QString> source;//计算字符串
//    QString pointName;//源名字
//    QVector<QString> purpose;//目的名字
//    void* luaUserData;//存放用户数据的地址
//    int userDataType = 0;
//};
//Q_DECLARE_METATYPE(BindingInformation);

struct Point;
class GY_CalculationClass : public QObject
{
    Q_OBJECT
public:
    explicit GY_CalculationClass(QObject *parent = nullptr);
    /**
     * @brief formulaCalculation 设置全局变量
     * @param name  变量名
     * @param type 变量类型
     * @return
     */
    bool formulaCalculation(const QString &name, const PropertyType& type);
    /**
     * @brief propertyChange 更改变量值
     * @param name 变量名
     * @param value 变量值
     * @param type 变量类型
     */
    void propertyChange(const QString &name,const QVariant &value, const PropertyType& type);
    /**
     * @brief getSourceValue 获取表达式结果
     * @param map 存放数据容器
     * @param name 变量名
     * @return
     */
    QString getSourceValue(QMap<QString,BindingInformation>& map, const QString &name);
    /**
     * @brief deleteVar 删除全局变量
     * @param name 变量名
     */
    void deleteVar(const QString& name);

    ~GY_CalculationClass();

signals:

private:
    //lua解释器
    lua_State* m_pLua;
    //point全局变量类型
    QMap<QString,Point*> m_pointVarMap;

private:
    /**
     * @brief setUserData 设置lua用户数据类型
     */
    void setUserData();

};

#endif // GY_CALCULATIONCLASS_H
